package com.spzx.channel.service.impl;

import com.spzx.channel.service.ItemService;
import com.spzx.common.core.domain.R;
import com.spzx.common.core.exception.ServiceException;
import com.spzx.product.api.RemoteProductService;
import com.spzx.product.domain.vo.ItemVO;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

@Service
public class ItemServiceImpl implements ItemService {
    @Resource
    RemoteProductService remoteProductService;
    //装配的是 spzx-common-redis RedisConfig中初始化的对象，配置了键和值的序列化器
    // 使用redisTemplate存储的值，会通过FastJson2转为json字符串存入到redis中
    @Resource
    RedisTemplate redisTemplate;
    /*
        openfeign拦截器：
            可以将feign远程访问的请求拦截 修改请求报文或者参数
     */
    //根据skuId查询商品详情业务
    @Override
    public ItemVO selectItemBySkuId(Long skuId) {
        //1、查询是否存在缓存  如果存在直接返回
        String key = "spzx:channel:item:" + skuId;
        Object cache = redisTemplate.opsForValue().get(key);
        if(!ObjectUtils.isEmpty(cache)){
            return (ItemVO) cache;
        }
        //2、查询缓存失败：远程调用查询数据库
        //商品数据都存在product库中 需要 spzx-product服务查询
        //只能等 product服务暴露一个接口 远程调用查询得到商品详情
        R<ItemVO> itemVOR = remoteProductService.getItemVOBySkuId(skuId);
        if(itemVOR.getCode()!=200){
            //远程调用失败
            throw new ServiceException(itemVOR.getMsg());
        }

        //3、缓存数据
        redisTemplate.opsForValue().set(key ,itemVOR.getData() );
        //返回查询到的结果
        return itemVOR.getData();
    }
}
